package cn.tedu.oop;

import org.junit.jupiter.api.Test;

/*本类用于oop第二天综合练习*/
public class TestTeacher {
    @Test
    public void test1() {
        Teacher0 t0 = new Teacher0();
      /*  t0.name = "泡泡鱼";
        System.out.println(t0.name);*/
        t0.ready();

    }
/*类里方法外+创建对象时执行，优先于构造方法执行+提取构造方法的共性*/
    /*被私有化的资源只能在本类中被访问
     * 按照提供的公共的设置值set与访问值get的方式来获取属性*/
    @Test
    public void test2() {
        Teacher0 t1 = new Teacher0();
        t1.setName("江江");
        System.out.println(t1.getName());
    }

    /*测试调用私有方法*/
    @Test
    public void test3() {
        Teacher0 t1 = new Teacher0();
        t1.ready();
    }

    /*测试全参构造器*/
    /*构造方法与类同名，且没有返回值类型的用来创建对象的方法
     * 构造方法在创建对象时对被调用创建几个调用几次
     * 默认存在无参构造器，但若有有参构造器，默认无参构造器会被覆盖
     * 注意手动添加无参构造器
     * 我们提供了丰富的构造方法，是为了外界创建对象时足够灵活
     * */
    @Test
    public void test4() {
        Teacher0 t2 = new Teacher0("kongfu", 17, "武术", 99999999);
        System.out.println(t2);
        t2.ready();
    }
}

//1.抽象封装形成老师类用于描述老师这一事务
class Teacher0 {
    //2.1提供属性
    private String name;//姓名
    private int age;//年龄
    private String subject;//科目
    private double salary;//工资

    //创建无参构造
    public Teacher0() {
        System.out.println("我是无参构造");
    }
    {
        System.out.println("我是一个构造代码块");
    }
    //创建全参构造

    public Teacher0(String name, int age, String subject, double salary) {
        /*有参构造器调用无参构造器*/
        this();
        this.name = name;
        this.age = age;
        this.subject = subject;
        this.salary = salary;
        System.out.println("我是全参构造");
    }

    //针对被封装的属性提供get set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    //3.提供功能也就是方法
    public void ready() {
        /*方法里+调用此方法时触发+用于限制变量的适用范围*/
        {
            System.out.println("我是一个局部代码块");
            int i=100;
            System.out.println(i);
        }
        System.out.println("正在备课ing.........");
        /*在公共方法中调用私有方法*/
        teach();
    }

    //封装讲课方法
    private void teach() {
        System.out.println("正在上课ing.........");
    }

    @Override
    public String toString() {
        return "Teacher0{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", subject='" + subject + '\'' +
                ", salary=" + salary +
                '}';
    }
}
